package com.sxpi.user.controller.login;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.map.MapUtil;
import com.sxpi.user.controller.BaseController;
import com.sxpi.user.service.user.IUserService;
import com.sxpi.user.dto.LoginDto;
import com.sxpi.common.exception.PugBusinessException;
import com.sxpi.common.result.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

/**
 * @Author: 董伟豪
 * @Date: 2022/10/1 23:10
 */
@RestController
@Slf4j
public class LoginController extends BaseController {

    @Autowired
    private IUserService userService;

    /**
     * 登录
     * @param loginVo
     * @return
     */
    @PostMapping("/login")
    public R login(@RequestBody LoginDto loginVo){
        // 这里就是远程调用，使用Openfeign
        R userResult = userService.login(loginVo);
        // 登录成功
        if(userResult != null && userResult.get("code").equals(200)){
            // 取出用户的id
            Long userId = MapUtil.getLong(userResult, "id");
            String username = MapUtil.getStr(userResult, "username");
            String avatar = MapUtil.getStr(userResult, "avatar");
            // 放入sputil进行登录 sa-login
            StpUtil.login(userId);
            // 将用户信息存储到Session中,redis中
            StpUtil.getSession().set("userId",userId);
            StpUtil.getSession().set("username",username);
            StpUtil.getSession().set("avatar",avatar);
            // 获取token
            String tokenValue = StpUtil.getTokenInfo().getTokenValue();
            // 返回（如果R.ok(login)如果字段中有code，那么就会和我R类中的冲突，最好的方法就是把这个放到put里面）
            return R.ok().put("user",userResult).put("token",tokenValue);
        }else{
            throw new PugBusinessException(501,"登录出现问题");
        }
    }

    /**
     * 退出登录
     * @return
     */
    @PostMapping("/logout")
    public R logout(){
        StpUtil.logout();
        return R.ok();
    }

    /**
     * 是否登录
     * @return
     */
    @PostMapping("/islogin")
    public R islogin(){
        boolean islogin = StpUtil.isLogin();
        return R.ok().put("isLogin",islogin);
    }

}
